// If something is in this list, then a direct identifier expression or property
// access chain matching this will be assumed to have no side effects and will
// be removed.
//
// This also means code is allowed to be reordered past things in this list. For
// example, if "console.log" is in this list, permitting reordering allows for
// "if (a) console.log(b); else console.log(c)" to be reordered and transformed
// into "console.log(a ? b : c)". Notice that "a" and "console.log" are in a
// different order, which can only happen if evaluating the "console.log"
// property access can be assumed to not change the value of "a".
//
// Note that membership in this list says nothing about whether calling any of
// these functions has any side effects. It only says something about
// referencing these function without calling them.
pub const global_no_side_effect_property_accesses = &[_][]const string{
    // Array: Static methods
    // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array#Static_methods
    &[_]string{ "Array", "from" },
    &[_]string{ "Array", "isArray" },
    &[_]string{ "Array", "of" },

    // JSON: Static methods
    &[_]string{ "JSON", "parse" },
    &[_]string{ "JSON", "stringify" },

    // Math: Static properties
    // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math#Static_properties
    &[_]string{ "Math", "E" },
    &[_]string{ "Math", "LN10" },
    &[_]string{ "Math", "LN2" },
    &[_]string{ "Math", "LOG10E" },
    &[_]string{ "Math", "LOG2E" },
    &[_]string{ "Math", "PI" },
    &[_]string{ "Math", "SQRT1_2" },
    &[_]string{ "Math", "SQRT2" },

    // Math: Static methods
    // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math#Static_methods
    &[_]string{ "Math", "abs" },
    &[_]string{ "Math", "acos" },
    &[_]string{ "Math", "acosh" },
    &[_]string{ "Math", "asin" },
    &[_]string{ "Math", "asinh" },
    &[_]string{ "Math", "atan" },
    &[_]string{ "Math", "atan2" },
    &[_]string{ "Math", "atanh" },
    &[_]string{ "Math", "cbrt" },
    &[_]string{ "Math", "ceil" },
    &[_]string{ "Math", "clz32" },
    &[_]string{ "Math", "cos" },
    &[_]string{ "Math", "cosh" },
    &[_]string{ "Math", "exp" },
    &[_]string{ "Math", "expm1" },
    &[_]string{ "Math", "floor" },
    &[_]string{ "Math", "fround" },
    &[_]string{ "Math", "hypot" },
    &[_]string{ "Math", "imul" },
    &[_]string{ "Math", "log" },
    &[_]string{ "Math", "log10" },
    &[_]string{ "Math", "log1p" },
    &[_]string{ "Math", "log2" },
    &[_]string{ "Math", "max" },
    &[_]string{ "Math", "min" },
    &[_]string{ "Math", "pow" },
    &[_]string{ "Math", "random" },
    &[_]string{ "Math", "round" },
    &[_]string{ "Math", "sign" },
    &[_]string{ "Math", "sin" },
    &[_]string{ "Math", "sinh" },
    &[_]string{ "Math", "sqrt" },
    &[_]string{ "Math", "tan" },
    &[_]string{ "Math", "tanh" },
    &[_]string{ "Math", "trunc" },

    // Number: Static methods
    &[_]string{ "Number", "isFinite" },
    &[_]string{ "Number", "isInteger" },
    &[_]string{ "Number", "isNaN" },
    &[_]string{ "Number", "isSafeInteger" },
    &[_]string{ "Number", "parseFloat" },
    &[_]string{ "Number", "parseInt" },

    // Object: Static methods
    // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object#Static_methods
    &[_]string{ "Object", "assign" },
    &[_]string{ "Object", "create" },
    &[_]string{ "Object", "defineProperties" },
    &[_]string{ "Object", "defineProperty" },
    &[_]string{ "Object", "entries" },
    &[_]string{ "Object", "freeze" },
    &[_]string{ "Object", "fromEntries" },
    &[_]string{ "Object", "getOwnPropertyDescriptor" },
    &[_]string{ "Object", "getOwnPropertyDescriptors" },
    &[_]string{ "Object", "getOwnPropertyNames" },
    &[_]string{ "Object", "getOwnPropertySymbols" },
    &[_]string{ "Object", "getPrototypeOf" },
    &[_]string{ "Object", "groupBy" },
    &[_]string{ "Object", "hasOwn" },
    &[_]string{ "Object", "is" },
    &[_]string{ "Object", "isExtensible" },
    &[_]string{ "Object", "isFrozen" },
    &[_]string{ "Object", "isSealed" },
    &[_]string{ "Object", "keys" },
    &[_]string{ "Object", "preventExtensions" },
    &[_]string{ "Object", "seal" },
    &[_]string{ "Object", "setPrototypeOf" },
    &[_]string{ "Object", "values" },

    // Object: Instance methods
    // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object#Instance_methods
    &[_]string{ "Object", "prototype", "__defineGetter__" },
    &[_]string{ "Object", "prototype", "__defineSetter__" },
    &[_]string{ "Object", "prototype", "__lookupGetter__" },
    &[_]string{ "Object", "prototype", "__lookupSetter__" },
    &[_]string{ "Object", "prototype", "hasOwnProperty" },
    &[_]string{ "Object", "prototype", "isPrototypeOf" },
    &[_]string{ "Object", "prototype", "propertyIsEnumerable" },
    &[_]string{ "Object", "prototype", "toLocaleString" },
    &[_]string{ "Object", "prototype", "toString" },
    &[_]string{ "Object", "prototype", "unwatch" },
    &[_]string{ "Object", "prototype", "valueOf" },
    &[_]string{ "Object", "prototype", "watch" },

    // Reflect: Static methods
    // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect#static_methods
    &[_]string{ "Reflect", "apply" },
    &[_]string{ "Reflect", "construct" },
    &[_]string{ "Reflect", "defineProperty" },
    &[_]string{ "Reflect", "deleteProperty" },
    &[_]string{ "Reflect", "get" },
    &[_]string{ "Reflect", "getOwnPropertyDescriptor" },
    &[_]string{ "Reflect", "getPrototypeOf" },
    &[_]string{ "Reflect", "has" },
    &[_]string{ "Reflect", "isExtensible" },
    &[_]string{ "Reflect", "ownKeys" },
    &[_]string{ "Reflect", "preventExtensions" },
    &[_]string{ "Reflect", "set" },
    &[_]string{ "Reflect", "setPrototypeOf" },

    // Symbol: Static properties
    // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol#static_properties
    &[_]string{ "Symbol", "asyncDispose" },
    &[_]string{ "Symbol", "asyncIterator" },
    &[_]string{ "Symbol", "dispose" },
    &[_]string{ "Symbol", "hasInstance" },
    &[_]string{ "Symbol", "isConcatSpreadable" },
    &[_]string{ "Symbol", "iterator" },
    &[_]string{ "Symbol", "match" },
    &[_]string{ "Symbol", "matchAll" },
    &[_]string{ "Symbol", "replace" },
    &[_]string{ "Symbol", "search" },
    &[_]string{ "Symbol", "species" },
    &[_]string{ "Symbol", "split" },
    &[_]string{ "Symbol", "toPrimitive" },
    &[_]string{ "Symbol", "toStringTag" },
    &[_]string{ "Symbol", "unscopables" },

    // Symbol: Static methods
    // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol#static_methods
    &[_]string{ "Symbol", "keyFor" },

    // Console method references are assumed to have no side effects
    // https://developer.mozilla.org/en-US/docs/Web/API/console
    &[_]string{ "console", "assert" },
    &[_]string{ "console", "clear" },
    &[_]string{ "console", "count" },
    &[_]string{ "console", "countReset" },
    &[_]string{ "console", "debug" },
    &[_]string{ "console", "dir" },
    &[_]string{ "console", "dirxml" },
    &[_]string{ "console", "error" },
    &[_]string{ "console", "group" },
    &[_]string{ "console", "groupCollapsed" },
    &[_]string{ "console", "groupEnd" },
    &[_]string{ "console", "info" },
    &[_]string{ "console", "log" },
    &[_]string{ "console", "table" },
    &[_]string{ "console", "time" },
    &[_]string{ "console", "timeEnd" },
    &[_]string{ "console", "timeLog" },
    &[_]string{ "console", "trace" },
    &[_]string{ "console", "warn" },

    // Crypto: Static methods
    &[_]string{ "crypto", "randomUUID" },
};

pub const global_no_side_effect_function_calls_safe_for_to_string = &[_][]const string{

    // Calling Symbol.for("foo") never throws (unless it's a rope string)
    // This improves React bundle sizes slightly.
    &[_]string{ "Symbol", "for" },

    // Haven't seen a bundle size improvement from adding more to this list yet.
};

const pure_global_identifier_define = &defines.IdentifierDefine{
    .flags = .{
        .valueless = true,
        .can_be_removed_if_unused = true,
    },
    .value = .{ .e_undefined = .{} },
};

const identifiers = struct {
    const nan_val = js_ast.E.Number{ .value = std.math.nan(f64) };

    const inf_val = js_ast.E.Number{ .value = std.math.inf(f64) };

    // Step 2. Swap in certain literal values because those can be constant folded
    pub const @"undefined" = &defines.IdentifierDefine{
        .value = js_ast.Expr.Data{ .e_undefined = .{} },
        .flags = .{
            .valueless = false,
            .can_be_removed_if_unused = true,
        },
    };
    pub const NaN = &defines.IdentifierDefine{
        .value = js_ast.Expr.Data{ .e_number = nan_val },
    };
    pub const Infinity = &defines.IdentifierDefine{
        .value = js_ast.Expr.Data{ .e_number = inf_val },
    };
};

const PureGlobalIdentifierValue = enum {
    NaN,
    Infinity,
    @"strict undefined",
    other,

    pub fn value(this: PureGlobalIdentifierValue) *const defines.IdentifierDefine {
        return switch (this) {
            .NaN => identifiers.NaN,
            .Infinity => identifiers.Infinity,
            .@"strict undefined" => identifiers.undefined,
            .other => pure_global_identifier_define,
        };
    }
};

pub const pure_global_identifier_map = bun.ComptimeStringMap(PureGlobalIdentifierValue, .{
    .{ "NaN", PureGlobalIdentifierValue.NaN },
    .{ "Infinity", PureGlobalIdentifierValue.Infinity },
    .{ "undefined", PureGlobalIdentifierValue.@"strict undefined" },

    // These global identifiers should exist in all JavaScript environments. This
    // deliberately omits "NaN", "Infinity", and "undefined" because these are
    // treated as automatically-inlined constants instead of identifiers.
    .{ "Array", PureGlobalIdentifierValue.other },
    .{ "Boolean", PureGlobalIdentifierValue.other },
    .{ "Function", PureGlobalIdentifierValue.other },
    .{ "Math", PureGlobalIdentifierValue.other },
    .{ "Number", PureGlobalIdentifierValue.other },
    .{ "Object", PureGlobalIdentifierValue.other },
    .{ "RegExp", PureGlobalIdentifierValue.other },
    .{ "String", PureGlobalIdentifierValue.other },

    // Other globals present in both the browser and node (except "eval" because
    // it has special behavior)
    .{ "AbortController", PureGlobalIdentifierValue.other },
    .{ "AbortSignal", PureGlobalIdentifierValue.other },
    .{ "AggregateError", PureGlobalIdentifierValue.other },
    .{ "ArrayBuffer", PureGlobalIdentifierValue.other },
    .{ "BigInt", PureGlobalIdentifierValue.other },
    .{ "DataView", PureGlobalIdentifierValue.other },
    .{ "Date", PureGlobalIdentifierValue.other },
    .{ "Error", PureGlobalIdentifierValue.other },
    .{ "EvalError", PureGlobalIdentifierValue.other },
    .{ "Event", PureGlobalIdentifierValue.other },
    .{ "EventTarget", PureGlobalIdentifierValue.other },
    .{ "Float16Array", PureGlobalIdentifierValue.other },
    .{ "Float32Array", PureGlobalIdentifierValue.other },
    .{ "Float64Array", PureGlobalIdentifierValue.other },
    .{ "Int16Array", PureGlobalIdentifierValue.other },
    .{ "Int32Array", PureGlobalIdentifierValue.other },
    .{ "Int8Array", PureGlobalIdentifierValue.other },
    .{ "Intl", PureGlobalIdentifierValue.other },
    .{ "JSON", PureGlobalIdentifierValue.other },
    .{ "Map", PureGlobalIdentifierValue.other },
    .{ "MessageChannel", PureGlobalIdentifierValue.other },
    .{ "MessageEvent", PureGlobalIdentifierValue.other },
    .{ "MessagePort", PureGlobalIdentifierValue.other },
    .{ "Promise", PureGlobalIdentifierValue.other },
    .{ "Proxy", PureGlobalIdentifierValue.other },
    .{ "RangeError", PureGlobalIdentifierValue.other },
    .{ "ReferenceError", PureGlobalIdentifierValue.other },
    .{ "Reflect", PureGlobalIdentifierValue.other },
    .{ "Set", PureGlobalIdentifierValue.other },
    .{ "Symbol", PureGlobalIdentifierValue.other },
    .{ "SyntaxError", PureGlobalIdentifierValue.other },
    .{ "TextDecoder", PureGlobalIdentifierValue.other },
    .{ "TextEncoder", PureGlobalIdentifierValue.other },
    .{ "TypeError", PureGlobalIdentifierValue.other },
    .{ "URIError", PureGlobalIdentifierValue.other },
    .{ "URL", PureGlobalIdentifierValue.other },
    .{ "URLSearchParams", PureGlobalIdentifierValue.other },
    .{ "Uint16Array", PureGlobalIdentifierValue.other },
    .{ "Uint32Array", PureGlobalIdentifierValue.other },
    .{ "Uint8Array", PureGlobalIdentifierValue.other },
    .{ "Uint8ClampedArray", PureGlobalIdentifierValue.other },
    .{ "WeakMap", PureGlobalIdentifierValue.other },
    .{ "WeakSet", PureGlobalIdentifierValue.other },
    .{ "WebAssembly", PureGlobalIdentifierValue.other },
    .{ "clearInterval", PureGlobalIdentifierValue.other },
    .{ "clearTimeout", PureGlobalIdentifierValue.other },
    .{ "console", PureGlobalIdentifierValue.other },
    .{ "decodeURI", PureGlobalIdentifierValue.other },
    .{ "decodeURIComponent", PureGlobalIdentifierValue.other },
    .{ "encodeURI", PureGlobalIdentifierValue.other },
    .{ "encodeURIComponent", PureGlobalIdentifierValue.other },
    .{ "escape", PureGlobalIdentifierValue.other },
    .{ "globalThis", PureGlobalIdentifierValue.other },
    .{ "isFinite", PureGlobalIdentifierValue.other },
    .{ "isNaN", PureGlobalIdentifierValue.other },
    .{ "parseFloat", PureGlobalIdentifierValue.other },
    .{ "parseInt", PureGlobalIdentifierValue.other },
    .{ "queueMicrotask", PureGlobalIdentifierValue.other },
    .{ "setInterval", PureGlobalIdentifierValue.other },
    .{ "setTimeout", PureGlobalIdentifierValue.other },
    .{ "unescape", PureGlobalIdentifierValue.other },

    // CSSOM APIs
    .{ "CSSAnimation", PureGlobalIdentifierValue.other },
    .{ "CSSFontFaceRule", PureGlobalIdentifierValue.other },
    .{ "CSSImportRule", PureGlobalIdentifierValue.other },
    .{ "CSSKeyframeRule", PureGlobalIdentifierValue.other },
    .{ "CSSKeyframesRule", PureGlobalIdentifierValue.other },
    .{ "CSSMediaRule", PureGlobalIdentifierValue.other },
    .{ "CSSNamespaceRule", PureGlobalIdentifierValue.other },
    .{ "CSSPageRule", PureGlobalIdentifierValue.other },
    .{ "CSSRule", PureGlobalIdentifierValue.other },
    .{ "CSSRuleList", PureGlobalIdentifierValue.other },
    .{ "CSSStyleDeclaration", PureGlobalIdentifierValue.other },
    .{ "CSSStyleRule", PureGlobalIdentifierValue.other },
    .{ "CSSStyleSheet", PureGlobalIdentifierValue.other },
    .{ "CSSSupportsRule", PureGlobalIdentifierValue.other },
    .{ "CSSTransition", PureGlobalIdentifierValue.other },

    // SVG DOM
    .{ "SVGAElement", PureGlobalIdentifierValue.other },
    .{ "SVGAngle", PureGlobalIdentifierValue.other },
    .{ "SVGAnimateElement", PureGlobalIdentifierValue.other },
    .{ "SVGAnimateMotionElement", PureGlobalIdentifierValue.other },
    .{ "SVGAnimateTransformElement", PureGlobalIdentifierValue.other },
    .{ "SVGAnimatedAngle", PureGlobalIdentifierValue.other },
    .{ "SVGAnimatedBoolean", PureGlobalIdentifierValue.other },
    .{ "SVGAnimatedEnumeration", PureGlobalIdentifierValue.other },
    .{ "SVGAnimatedInteger", PureGlobalIdentifierValue.other },
    .{ "SVGAnimatedLength", PureGlobalIdentifierValue.other },
    .{ "SVGAnimatedLengthList", PureGlobalIdentifierValue.other },
    .{ "SVGAnimatedNumber", PureGlobalIdentifierValue.other },
    .{ "SVGAnimatedNumberList", PureGlobalIdentifierValue.other },
    .{ "SVGAnimatedPreserveAspectRatio", PureGlobalIdentifierValue.other },
    .{ "SVGAnimatedRect", PureGlobalIdentifierValue.other },
    .{ "SVGAnimatedString", PureGlobalIdentifierValue.other },
    .{ "SVGAnimatedTransformList", PureGlobalIdentifierValue.other },
    .{ "SVGAnimationElement", PureGlobalIdentifierValue.other },
    .{ "SVGCircleElement", PureGlobalIdentifierValue.other },
    .{ "SVGClipPathElement", PureGlobalIdentifierValue.other },
    .{ "SVGComponentTransferFunctionElement", PureGlobalIdentifierValue.other },
    .{ "SVGDefsElement", PureGlobalIdentifierValue.other },
    .{ "SVGDescElement", PureGlobalIdentifierValue.other },
    .{ "SVGElement", PureGlobalIdentifierValue.other },
    .{ "SVGEllipseElement", PureGlobalIdentifierValue.other },
    .{ "SVGFEBlendElement", PureGlobalIdentifierValue.other },
    .{ "SVGFEColorMatrixElement", PureGlobalIdentifierValue.other },
    .{ "SVGFEComponentTransferElement", PureGlobalIdentifierValue.other },
    .{ "SVGFECompositeElement", PureGlobalIdentifierValue.other },
    .{ "SVGFEConvolveMatrixElement", PureGlobalIdentifierValue.other },
    .{ "SVGFEDiffuseLightingElement", PureGlobalIdentifierValue.other },
    .{ "SVGFEDisplacementMapElement", PureGlobalIdentifierValue.other },
    .{ "SVGFEDistantLightElement", PureGlobalIdentifierValue.other },
    .{ "SVGFEDropShadowElement", PureGlobalIdentifierValue.other },
    .{ "SVGFEFloodElement", PureGlobalIdentifierValue.other },
    .{ "SVGFEFuncAElement", PureGlobalIdentifierValue.other },
    .{ "SVGFEFuncBElement", PureGlobalIdentifierValue.other },
    .{ "SVGFEFuncGElement", PureGlobalIdentifierValue.other },
    .{ "SVGFEFuncRElement", PureGlobalIdentifierValue.other },
    .{ "SVGFEGaussianBlurElement", PureGlobalIdentifierValue.other },
    .{ "SVGFEImageElement", PureGlobalIdentifierValue.other },
    .{ "SVGFEMergeElement", PureGlobalIdentifierValue.other },
    .{ "SVGFEMergeNodeElement", PureGlobalIdentifierValue.other },
    .{ "SVGFEMorphologyElement", PureGlobalIdentifierValue.other },
    .{ "SVGFEOffsetElement", PureGlobalIdentifierValue.other },
    .{ "SVGFEPointLightElement", PureGlobalIdentifierValue.other },
    .{ "SVGFESpecularLightingElement", PureGlobalIdentifierValue.other },
    .{ "SVGFESpotLightElement", PureGlobalIdentifierValue.other },
    .{ "SVGFETileElement", PureGlobalIdentifierValue.other },
    .{ "SVGFETurbulenceElement", PureGlobalIdentifierValue.other },
    .{ "SVGFilterElement", PureGlobalIdentifierValue.other },
    .{ "SVGForeignObjectElement", PureGlobalIdentifierValue.other },
    .{ "SVGGElement", PureGlobalIdentifierValue.other },
    .{ "SVGGeometryElement", PureGlobalIdentifierValue.other },
    .{ "SVGGradientElement", PureGlobalIdentifierValue.other },
    .{ "SVGGraphicsElement", PureGlobalIdentifierValue.other },
    .{ "SVGImageElement", PureGlobalIdentifierValue.other },
    .{ "SVGLength", PureGlobalIdentifierValue.other },
    .{ "SVGLengthList", PureGlobalIdentifierValue.other },
    .{ "SVGLineElement", PureGlobalIdentifierValue.other },
    .{ "SVGLinearGradientElement", PureGlobalIdentifierValue.other },
    .{ "SVGMPathElement", PureGlobalIdentifierValue.other },
    .{ "SVGMarkerElement", PureGlobalIdentifierValue.other },
    .{ "SVGMaskElement", PureGlobalIdentifierValue.other },
    .{ "SVGMatrix", PureGlobalIdentifierValue.other },
    .{ "SVGMetadataElement", PureGlobalIdentifierValue.other },
    .{ "SVGNumber", PureGlobalIdentifierValue.other },
    .{ "SVGNumberList", PureGlobalIdentifierValue.other },
    .{ "SVGPathElement", PureGlobalIdentifierValue.other },
    .{ "SVGPatternElement", PureGlobalIdentifierValue.other },
    .{ "SVGPoint", PureGlobalIdentifierValue.other },
    .{ "SVGPointList", PureGlobalIdentifierValue.other },
    .{ "SVGPolygonElement", PureGlobalIdentifierValue.other },
    .{ "SVGPolylineElement", PureGlobalIdentifierValue.other },
    .{ "SVGPreserveAspectRatio", PureGlobalIdentifierValue.other },
    .{ "SVGRadialGradientElement", PureGlobalIdentifierValue.other },
    .{ "SVGRect", PureGlobalIdentifierValue.other },
    .{ "SVGRectElement", PureGlobalIdentifierValue.other },
    .{ "SVGSVGElement", PureGlobalIdentifierValue.other },
    .{ "SVGScriptElement", PureGlobalIdentifierValue.other },
    .{ "SVGSetElement", PureGlobalIdentifierValue.other },
    .{ "SVGStopElement", PureGlobalIdentifierValue.other },
    .{ "SVGStringList", PureGlobalIdentifierValue.other },
    .{ "SVGStyleElement", PureGlobalIdentifierValue.other },
    .{ "SVGSwitchElement", PureGlobalIdentifierValue.other },
    .{ "SVGSymbolElement", PureGlobalIdentifierValue.other },
    .{ "SVGTSpanElement", PureGlobalIdentifierValue.other },
    .{ "SVGTextContentElement", PureGlobalIdentifierValue.other },
    .{ "SVGTextElement", PureGlobalIdentifierValue.other },
    .{ "SVGTextPathElement", PureGlobalIdentifierValue.other },
    .{ "SVGTextPositioningElement", PureGlobalIdentifierValue.other },
    .{ "SVGTitleElement", PureGlobalIdentifierValue.other },
    .{ "SVGTransform", PureGlobalIdentifierValue.other },
    .{ "SVGTransformList", PureGlobalIdentifierValue.other },
    .{ "SVGUnitTypes", PureGlobalIdentifierValue.other },
    .{ "SVGUseElement", PureGlobalIdentifierValue.other },
    .{ "SVGViewElement", PureGlobalIdentifierValue.other },

    // Other browser APIs
    //
    // This list contains all globals present in modern versions of Chrome, Safari,
    // and Firefox except for the following properties, since they have a side effect
    // of triggering layout (https://gist.github.com/paulirish/5d52fb081b3570c81e3a):
    //
    //   - scrollX
    //   - scrollY
    //   - innerWidth
    //   - innerHeight
    //   - pageXOffset
    //   - pageYOffset
    //
    // The following globals have also been removed since they sometimes throw an
    // exception when accessed, which is a side effect (for more information see
    // https://stackoverflow.com/a/33047477):
    //
    //   - localStorage
    //   - sessionStorage
    //
    .{ "AnalyserNode", PureGlobalIdentifierValue.other },
    .{ "Animation", PureGlobalIdentifierValue.other },
    .{ "AnimationEffect", PureGlobalIdentifierValue.other },
    .{ "AnimationEvent", PureGlobalIdentifierValue.other },
    .{ "AnimationPlaybackEvent", PureGlobalIdentifierValue.other },
    .{ "AnimationTimeline", PureGlobalIdentifierValue.other },
    .{ "Attr", PureGlobalIdentifierValue.other },
    .{ "Audio", PureGlobalIdentifierValue.other },
    .{ "AudioBuffer", PureGlobalIdentifierValue.other },
    .{ "AudioBufferSourceNode", PureGlobalIdentifierValue.other },
    .{ "AudioDestinationNode", PureGlobalIdentifierValue.other },
    .{ "AudioListener", PureGlobalIdentifierValue.other },
    .{ "AudioNode", PureGlobalIdentifierValue.other },
    .{ "AudioParam", PureGlobalIdentifierValue.other },
    .{ "AudioProcessingEvent", PureGlobalIdentifierValue.other },
    .{ "AudioScheduledSourceNode", PureGlobalIdentifierValue.other },
    .{ "BarProp", PureGlobalIdentifierValue.other },
    .{ "BeforeUnloadEvent", PureGlobalIdentifierValue.other },
    .{ "BiquadFilterNode", PureGlobalIdentifierValue.other },
    .{ "Blob", PureGlobalIdentifierValue.other },
    .{ "BlobEvent", PureGlobalIdentifierValue.other },
    .{ "ByteLengthQueuingStrategy", PureGlobalIdentifierValue.other },
    .{ "CDATASection", PureGlobalIdentifierValue.other },
    .{ "CSS", PureGlobalIdentifierValue.other },
    .{ "CanvasGradient", PureGlobalIdentifierValue.other },
    .{ "CanvasPattern", PureGlobalIdentifierValue.other },
    .{ "CanvasRenderingContext2D", PureGlobalIdentifierValue.other },
    .{ "ChannelMergerNode", PureGlobalIdentifierValue.other },
    .{ "ChannelSplitterNode", PureGlobalIdentifierValue.other },
    .{ "CharacterData", PureGlobalIdentifierValue.other },
    .{ "ClipboardEvent", PureGlobalIdentifierValue.other },
    .{ "CloseEvent", PureGlobalIdentifierValue.other },
    .{ "Comment", PureGlobalIdentifierValue.other },
    .{ "CompositionEvent", PureGlobalIdentifierValue.other },
    .{ "ConvolverNode", PureGlobalIdentifierValue.other },
    .{ "CountQueuingStrategy", PureGlobalIdentifierValue.other },
    .{ "Crypto", PureGlobalIdentifierValue.other },
    .{ "CustomElementRegistry", PureGlobalIdentifierValue.other },
    .{ "CustomEvent", PureGlobalIdentifierValue.other },
    .{ "DOMException", PureGlobalIdentifierValue.other },
    .{ "DOMImplementation", PureGlobalIdentifierValue.other },
    .{ "DOMMatrix", PureGlobalIdentifierValue.other },
    .{ "DOMMatrixReadOnly", PureGlobalIdentifierValue.other },
    .{ "DOMParser", PureGlobalIdentifierValue.other },
    .{ "DOMPoint", PureGlobalIdentifierValue.other },
    .{ "DOMPointReadOnly", PureGlobalIdentifierValue.other },
    .{ "DOMQuad", PureGlobalIdentifierValue.other },
    .{ "DOMRect", PureGlobalIdentifierValue.other },
    .{ "DOMRectList", PureGlobalIdentifierValue.other },
    .{ "DOMRectReadOnly", PureGlobalIdentifierValue.other },
    .{ "DOMStringList", PureGlobalIdentifierValue.other },
    .{ "DOMStringMap", PureGlobalIdentifierValue.other },
    .{ "DOMTokenList", PureGlobalIdentifierValue.other },
    .{ "DataTransfer", PureGlobalIdentifierValue.other },
    .{ "DataTransferItem", PureGlobalIdentifierValue.other },
    .{ "DataTransferItemList", PureGlobalIdentifierValue.other },
    .{ "DelayNode", PureGlobalIdentifierValue.other },
    .{ "Document", PureGlobalIdentifierValue.other },
    .{ "DocumentFragment", PureGlobalIdentifierValue.other },
    .{ "DocumentTimeline", PureGlobalIdentifierValue.other },
    .{ "DocumentType", PureGlobalIdentifierValue.other },
    .{ "DragEvent", PureGlobalIdentifierValue.other },
    .{ "DynamicsCompressorNode", PureGlobalIdentifierValue.other },
    .{ "Element", PureGlobalIdentifierValue.other },
    .{ "ErrorEvent", PureGlobalIdentifierValue.other },
    .{ "EventSource", PureGlobalIdentifierValue.other },
    .{ "File", PureGlobalIdentifierValue.other },
    .{ "FileList", PureGlobalIdentifierValue.other },
    .{ "FileReader", PureGlobalIdentifierValue.other },
    .{ "FocusEvent", PureGlobalIdentifierValue.other },
    .{ "FontFace", PureGlobalIdentifierValue.other },
    .{ "FormData", PureGlobalIdentifierValue.other },
    .{ "GainNode", PureGlobalIdentifierValue.other },
    .{ "Gamepad", PureGlobalIdentifierValue.other },
    .{ "GamepadButton", PureGlobalIdentifierValue.other },
    .{ "GamepadEvent", PureGlobalIdentifierValue.other },
    .{ "Geolocation", PureGlobalIdentifierValue.other },
    .{ "GeolocationPositionError", PureGlobalIdentifierValue.other },
    .{ "HTMLAllCollection", PureGlobalIdentifierValue.other },
    .{ "HTMLAnchorElement", PureGlobalIdentifierValue.other },
    .{ "HTMLAreaElement", PureGlobalIdentifierValue.other },
    .{ "HTMLAudioElement", PureGlobalIdentifierValue.other },
    .{ "HTMLBRElement", PureGlobalIdentifierValue.other },
    .{ "HTMLBaseElement", PureGlobalIdentifierValue.other },
    .{ "HTMLBodyElement", PureGlobalIdentifierValue.other },
    .{ "HTMLButtonElement", PureGlobalIdentifierValue.other },
    .{ "HTMLCanvasElement", PureGlobalIdentifierValue.other },
    .{ "HTMLCollection", PureGlobalIdentifierValue.other },
    .{ "HTMLDListElement", PureGlobalIdentifierValue.other },
    .{ "HTMLDataElement", PureGlobalIdentifierValue.other },
    .{ "HTMLDataListElement", PureGlobalIdentifierValue.other },
    .{ "HTMLDetailsElement", PureGlobalIdentifierValue.other },
    .{ "HTMLDirectoryElement", PureGlobalIdentifierValue.other },
    .{ "HTMLDivElement", PureGlobalIdentifierValue.other },
    .{ "HTMLDocument", PureGlobalIdentifierValue.other },
    .{ "HTMLElement", PureGlobalIdentifierValue.other },
    .{ "HTMLEmbedElement", PureGlobalIdentifierValue.other },
    .{ "HTMLFieldSetElement", PureGlobalIdentifierValue.other },
    .{ "HTMLFontElement", PureGlobalIdentifierValue.other },
    .{ "HTMLFormControlsCollection", PureGlobalIdentifierValue.other },
    .{ "HTMLFormElement", PureGlobalIdentifierValue.other },
    .{ "HTMLFrameElement", PureGlobalIdentifierValue.other },
    .{ "HTMLFrameSetElement", PureGlobalIdentifierValue.other },
    .{ "HTMLHRElement", PureGlobalIdentifierValue.other },
    .{ "HTMLHeadElement", PureGlobalIdentifierValue.other },
    .{ "HTMLHeadingElement", PureGlobalIdentifierValue.other },
    .{ "HTMLHtmlElement", PureGlobalIdentifierValue.other },
    .{ "HTMLIFrameElement", PureGlobalIdentifierValue.other },
    .{ "HTMLImageElement", PureGlobalIdentifierValue.other },
    .{ "HTMLInputElement", PureGlobalIdentifierValue.other },
    .{ "HTMLLIElement", PureGlobalIdentifierValue.other },
    .{ "HTMLLabelElement", PureGlobalIdentifierValue.other },
    .{ "HTMLLegendElement", PureGlobalIdentifierValue.other },
    .{ "HTMLLinkElement", PureGlobalIdentifierValue.other },
    .{ "HTMLMapElement", PureGlobalIdentifierValue.other },
    .{ "HTMLMarqueeElement", PureGlobalIdentifierValue.other },
    .{ "HTMLMediaElement", PureGlobalIdentifierValue.other },
    .{ "HTMLMenuElement", PureGlobalIdentifierValue.other },
    .{ "HTMLMetaElement", PureGlobalIdentifierValue.other },
    .{ "HTMLMeterElement", PureGlobalIdentifierValue.other },
    .{ "HTMLModElement", PureGlobalIdentifierValue.other },
    .{ "HTMLOListElement", PureGlobalIdentifierValue.other },
    .{ "HTMLObjectElement", PureGlobalIdentifierValue.other },
    .{ "HTMLOptGroupElement", PureGlobalIdentifierValue.other },
    .{ "HTMLOptionElement", PureGlobalIdentifierValue.other },
    .{ "HTMLOptionsCollection", PureGlobalIdentifierValue.other },
    .{ "HTMLOutputElement", PureGlobalIdentifierValue.other },
    .{ "HTMLParagraphElement", PureGlobalIdentifierValue.other },
    .{ "HTMLParamElement", PureGlobalIdentifierValue.other },
    .{ "HTMLPictureElement", PureGlobalIdentifierValue.other },
    .{ "HTMLPreElement", PureGlobalIdentifierValue.other },
    .{ "HTMLProgressElement", PureGlobalIdentifierValue.other },
    .{ "HTMLQuoteElement", PureGlobalIdentifierValue.other },
    .{ "HTMLScriptElement", PureGlobalIdentifierValue.other },
    .{ "HTMLSelectElement", PureGlobalIdentifierValue.other },
    .{ "HTMLSlotElement", PureGlobalIdentifierValue.other },
    .{ "HTMLSourceElement", PureGlobalIdentifierValue.other },
    .{ "HTMLSpanElement", PureGlobalIdentifierValue.other },
    .{ "HTMLStyleElement", PureGlobalIdentifierValue.other },
    .{ "HTMLTableCaptionElement", PureGlobalIdentifierValue.other },
    .{ "HTMLTableCellElement", PureGlobalIdentifierValue.other },
    .{ "HTMLTableColElement", PureGlobalIdentifierValue.other },
    .{ "HTMLTableElement", PureGlobalIdentifierValue.other },
    .{ "HTMLTableRowElement", PureGlobalIdentifierValue.other },
    .{ "HTMLTableSectionElement", PureGlobalIdentifierValue.other },
    .{ "HTMLTemplateElement", PureGlobalIdentifierValue.other },
    .{ "HTMLTextAreaElement", PureGlobalIdentifierValue.other },
    .{ "HTMLTimeElement", PureGlobalIdentifierValue.other },
    .{ "HTMLTitleElement", PureGlobalIdentifierValue.other },
    .{ "HTMLTrackElement", PureGlobalIdentifierValue.other },
    .{ "HTMLUListElement", PureGlobalIdentifierValue.other },
    .{ "HTMLUnknownElement", PureGlobalIdentifierValue.other },
    .{ "HTMLVideoElement", PureGlobalIdentifierValue.other },
    .{ "HashChangeEvent", PureGlobalIdentifierValue.other },
    .{ "Headers", PureGlobalIdentifierValue.other },
    .{ "History", PureGlobalIdentifierValue.other },
    .{ "IDBCursor", PureGlobalIdentifierValue.other },
    .{ "IDBCursorWithValue", PureGlobalIdentifierValue.other },
    .{ "IDBDatabase", PureGlobalIdentifierValue.other },
    .{ "IDBFactory", PureGlobalIdentifierValue.other },
    .{ "IDBIndex", PureGlobalIdentifierValue.other },
    .{ "IDBKeyRange", PureGlobalIdentifierValue.other },
    .{ "IDBObjectStore", PureGlobalIdentifierValue.other },
    .{ "IDBOpenDBRequest", PureGlobalIdentifierValue.other },
    .{ "IDBRequest", PureGlobalIdentifierValue.other },
    .{ "IDBTransaction", PureGlobalIdentifierValue.other },
    .{ "IDBVersionChangeEvent", PureGlobalIdentifierValue.other },
    .{ "Image", PureGlobalIdentifierValue.other },
    .{ "ImageData", PureGlobalIdentifierValue.other },
    .{ "InputEvent", PureGlobalIdentifierValue.other },
    .{ "IntersectionObserver", PureGlobalIdentifierValue.other },
    .{ "IntersectionObserverEntry", PureGlobalIdentifierValue.other },
    .{ "KeyboardEvent", PureGlobalIdentifierValue.other },
    .{ "KeyframeEffect", PureGlobalIdentifierValue.other },
    .{ "Location", PureGlobalIdentifierValue.other },
    .{ "MediaCapabilities", PureGlobalIdentifierValue.other },
    .{ "MediaElementAudioSourceNode", PureGlobalIdentifierValue.other },
    .{ "MediaEncryptedEvent", PureGlobalIdentifierValue.other },
    .{ "MediaError", PureGlobalIdentifierValue.other },
    .{ "MediaList", PureGlobalIdentifierValue.other },
    .{ "MediaQueryList", PureGlobalIdentifierValue.other },
    .{ "MediaQueryListEvent", PureGlobalIdentifierValue.other },
    .{ "MediaRecorder", PureGlobalIdentifierValue.other },
    .{ "MediaSource", PureGlobalIdentifierValue.other },
    .{ "MediaStream", PureGlobalIdentifierValue.other },
    .{ "MediaStreamAudioDestinationNode", PureGlobalIdentifierValue.other },
    .{ "MediaStreamAudioSourceNode", PureGlobalIdentifierValue.other },
    .{ "MediaStreamTrack", PureGlobalIdentifierValue.other },
    .{ "MediaStreamTrackEvent", PureGlobalIdentifierValue.other },
    .{ "MimeType", PureGlobalIdentifierValue.other },
    .{ "MimeTypeArray", PureGlobalIdentifierValue.other },
    .{ "MouseEvent", PureGlobalIdentifierValue.other },
    .{ "MutationEvent", PureGlobalIdentifierValue.other },
    .{ "MutationObserver", PureGlobalIdentifierValue.other },
    .{ "MutationRecord", PureGlobalIdentifierValue.other },
    .{ "NamedNodeMap", PureGlobalIdentifierValue.other },
    .{ "Navigator", PureGlobalIdentifierValue.other },
    .{ "Node", PureGlobalIdentifierValue.other },
    .{ "NodeFilter", PureGlobalIdentifierValue.other },
    .{ "NodeIterator", PureGlobalIdentifierValue.other },
    .{ "NodeList", PureGlobalIdentifierValue.other },
    .{ "Notification", PureGlobalIdentifierValue.other },
    .{ "OfflineAudioCompletionEvent", PureGlobalIdentifierValue.other },
    .{ "Option", PureGlobalIdentifierValue.other },
    .{ "OscillatorNode", PureGlobalIdentifierValue.other },
    .{ "PageTransitionEvent", PureGlobalIdentifierValue.other },
    .{ "Path2D", PureGlobalIdentifierValue.other },
    .{ "Performance", PureGlobalIdentifierValue.other },
    .{ "PerformanceEntry", PureGlobalIdentifierValue.other },
    .{ "PerformanceMark", PureGlobalIdentifierValue.other },
    .{ "PerformanceMeasure", PureGlobalIdentifierValue.other },
    .{ "PerformanceNavigation", PureGlobalIdentifierValue.other },
    .{ "PerformanceObserver", PureGlobalIdentifierValue.other },
    .{ "PerformanceObserverEntryList", PureGlobalIdentifierValue.other },
    .{ "PerformanceResourceTiming", PureGlobalIdentifierValue.other },
    .{ "PerformanceTiming", PureGlobalIdentifierValue.other },
    .{ "PeriodicWave", PureGlobalIdentifierValue.other },
    .{ "Plugin", PureGlobalIdentifierValue.other },
    .{ "PluginArray", PureGlobalIdentifierValue.other },
    .{ "PointerEvent", PureGlobalIdentifierValue.other },
    .{ "PopStateEvent", PureGlobalIdentifierValue.other },
    .{ "ProcessingInstruction", PureGlobalIdentifierValue.other },
    .{ "ProgressEvent", PureGlobalIdentifierValue.other },
    .{ "PromiseRejectionEvent", PureGlobalIdentifierValue.other },
    .{ "RTCCertificate", PureGlobalIdentifierValue.other },
    .{ "RTCDTMFSender", PureGlobalIdentifierValue.other },
    .{ "RTCDTMFToneChangeEvent", PureGlobalIdentifierValue.other },
    .{ "RTCDataChannel", PureGlobalIdentifierValue.other },
    .{ "RTCDataChannelEvent", PureGlobalIdentifierValue.other },
    .{ "RTCIceCandidate", PureGlobalIdentifierValue.other },
    .{ "RTCPeerConnection", PureGlobalIdentifierValue.other },
    .{ "RTCPeerConnectionIceEvent", PureGlobalIdentifierValue.other },
    .{ "RTCRtpReceiver", PureGlobalIdentifierValue.other },
    .{ "RTCRtpSender", PureGlobalIdentifierValue.other },
    .{ "RTCRtpTransceiver", PureGlobalIdentifierValue.other },
    .{ "RTCSessionDescription", PureGlobalIdentifierValue.other },
    .{ "RTCStatsReport", PureGlobalIdentifierValue.other },
    .{ "RTCTrackEvent", PureGlobalIdentifierValue.other },
    .{ "RadioNodeList", PureGlobalIdentifierValue.other },
    .{ "Range", PureGlobalIdentifierValue.other },
    .{ "ReadableStream", PureGlobalIdentifierValue.other },
    .{ "Request", PureGlobalIdentifierValue.other },
    .{ "ResizeObserver", PureGlobalIdentifierValue.other },
    .{ "ResizeObserverEntry", PureGlobalIdentifierValue.other },
    .{ "Response", PureGlobalIdentifierValue.other },
    .{ "Screen", PureGlobalIdentifierValue.other },
    .{ "ScriptProcessorNode", PureGlobalIdentifierValue.other },
    .{ "SecurityPolicyViolationEvent", PureGlobalIdentifierValue.other },
    .{ "Selection", PureGlobalIdentifierValue.other },
    .{ "ShadowRoot", PureGlobalIdentifierValue.other },
    .{ "SourceBuffer", PureGlobalIdentifierValue.other },
    .{ "SourceBufferList", PureGlobalIdentifierValue.other },
    .{ "SpeechSynthesisEvent", PureGlobalIdentifierValue.other },
    .{ "SpeechSynthesisUtterance", PureGlobalIdentifierValue.other },
    .{ "StaticRange", PureGlobalIdentifierValue.other },
    .{ "Storage", PureGlobalIdentifierValue.other },
    .{ "StorageEvent", PureGlobalIdentifierValue.other },
    .{ "StyleSheet", PureGlobalIdentifierValue.other },
    .{ "StyleSheetList", PureGlobalIdentifierValue.other },
    .{ "Text", PureGlobalIdentifierValue.other },
    .{ "TextMetrics", PureGlobalIdentifierValue.other },
    .{ "TextTrack", PureGlobalIdentifierValue.other },
    .{ "TextTrackCue", PureGlobalIdentifierValue.other },
    .{ "TextTrackCueList", PureGlobalIdentifierValue.other },
    .{ "TextTrackList", PureGlobalIdentifierValue.other },
    .{ "TimeRanges", PureGlobalIdentifierValue.other },
    .{ "TrackEvent", PureGlobalIdentifierValue.other },
    .{ "TransitionEvent", PureGlobalIdentifierValue.other },
    .{ "TreeWalker", PureGlobalIdentifierValue.other },
    .{ "UIEvent", PureGlobalIdentifierValue.other },
    .{ "VTTCue", PureGlobalIdentifierValue.other },
    .{ "ValidityState", PureGlobalIdentifierValue.other },
    .{ "VisualViewport", PureGlobalIdentifierValue.other },
    .{ "WaveShaperNode", PureGlobalIdentifierValue.other },
    .{ "WebGLActiveInfo", PureGlobalIdentifierValue.other },
    .{ "WebGLBuffer", PureGlobalIdentifierValue.other },
    .{ "WebGLContextEvent", PureGlobalIdentifierValue.other },
    .{ "WebGLFramebuffer", PureGlobalIdentifierValue.other },
    .{ "WebGLProgram", PureGlobalIdentifierValue.other },
    .{ "WebGLQuery", PureGlobalIdentifierValue.other },
    .{ "WebGLRenderbuffer", PureGlobalIdentifierValue.other },
    .{ "WebGLRenderingContext", PureGlobalIdentifierValue.other },
    .{ "WebGLSampler", PureGlobalIdentifierValue.other },
    .{ "WebGLShader", PureGlobalIdentifierValue.other },
    .{ "WebGLShaderPrecisionFormat", PureGlobalIdentifierValue.other },
    .{ "WebGLSync", PureGlobalIdentifierValue.other },
    .{ "WebGLTexture", PureGlobalIdentifierValue.other },
    .{ "WebGLUniformLocation", PureGlobalIdentifierValue.other },
    .{ "WebKitCSSMatrix", PureGlobalIdentifierValue.other },
    .{ "WebSocket", PureGlobalIdentifierValue.other },
    .{ "WheelEvent", PureGlobalIdentifierValue.other },
    .{ "Window", PureGlobalIdentifierValue.other },
    .{ "Worker", PureGlobalIdentifierValue.other },
    .{ "XMLDocument", PureGlobalIdentifierValue.other },
    .{ "XMLHttpRequest", PureGlobalIdentifierValue.other },
    .{ "XMLHttpRequestEventTarget", PureGlobalIdentifierValue.other },
    .{ "XMLHttpRequestUpload", PureGlobalIdentifierValue.other },
    .{ "XMLSerializer", PureGlobalIdentifierValue.other },
    .{ "XPathEvaluator", PureGlobalIdentifierValue.other },
    .{ "XPathExpression", PureGlobalIdentifierValue.other },
    .{ "XPathResult", PureGlobalIdentifierValue.other },
    .{ "XSLTProcessor", PureGlobalIdentifierValue.other },
    .{ "alert", PureGlobalIdentifierValue.other },
    .{ "atob", PureGlobalIdentifierValue.other },
    .{ "blur", PureGlobalIdentifierValue.other },
    .{ "btoa", PureGlobalIdentifierValue.other },
    .{ "cancelAnimationFrame", PureGlobalIdentifierValue.other },
    .{ "captureEvents", PureGlobalIdentifierValue.other },
    .{ "close", PureGlobalIdentifierValue.other },
    .{ "closed", PureGlobalIdentifierValue.other },
    .{ "confirm", PureGlobalIdentifierValue.other },
    .{ "customElements", PureGlobalIdentifierValue.other },
    .{ "devicePixelRatio", PureGlobalIdentifierValue.other },
    .{ "document", PureGlobalIdentifierValue.other },
    .{ "event", PureGlobalIdentifierValue.other },
    .{ "fetch", PureGlobalIdentifierValue.other },
    .{ "find", PureGlobalIdentifierValue.other },
    .{ "focus", PureGlobalIdentifierValue.other },
    .{ "frameElement", PureGlobalIdentifierValue.other },
    .{ "frames", PureGlobalIdentifierValue.other },
    .{ "getComputedStyle", PureGlobalIdentifierValue.other },
    .{ "getSelection", PureGlobalIdentifierValue.other },
    .{ "history", PureGlobalIdentifierValue.other },
    .{ "indexedDB", PureGlobalIdentifierValue.other },
    .{ "isSecureContext", PureGlobalIdentifierValue.other },
    .{ "length", PureGlobalIdentifierValue.other },
    .{ "location", PureGlobalIdentifierValue.other },
    .{ "locationbar", PureGlobalIdentifierValue.other },
    .{ "matchMedia", PureGlobalIdentifierValue.other },
    .{ "menubar", PureGlobalIdentifierValue.other },
    .{ "moveBy", PureGlobalIdentifierValue.other },
    .{ "moveTo", PureGlobalIdentifierValue.other },
    .{ "name", PureGlobalIdentifierValue.other },
    .{ "navigator", PureGlobalIdentifierValue.other },
    .{ "onabort", PureGlobalIdentifierValue.other },
    .{ "onafterprint", PureGlobalIdentifierValue.other },
    .{ "onanimationend", PureGlobalIdentifierValue.other },
    .{ "onanimationiteration", PureGlobalIdentifierValue.other },
    .{ "onanimationstart", PureGlobalIdentifierValue.other },
    .{ "onbeforeprint", PureGlobalIdentifierValue.other },
    .{ "onbeforeunload", PureGlobalIdentifierValue.other },
    .{ "onblur", PureGlobalIdentifierValue.other },
    .{ "oncanplay", PureGlobalIdentifierValue.other },
    .{ "oncanplaythrough", PureGlobalIdentifierValue.other },
    .{ "onchange", PureGlobalIdentifierValue.other },
    .{ "onclick", PureGlobalIdentifierValue.other },
    .{ "oncontextmenu", PureGlobalIdentifierValue.other },
    .{ "oncuechange", PureGlobalIdentifierValue.other },
    .{ "ondblclick", PureGlobalIdentifierValue.other },
    .{ "ondrag", PureGlobalIdentifierValue.other },
    .{ "ondragend", PureGlobalIdentifierValue.other },
    .{ "ondragenter", PureGlobalIdentifierValue.other },
    .{ "ondragleave", PureGlobalIdentifierValue.other },
    .{ "ondragover", PureGlobalIdentifierValue.other },
    .{ "ondragstart", PureGlobalIdentifierValue.other },
    .{ "ondrop", PureGlobalIdentifierValue.other },
    .{ "ondurationchange", PureGlobalIdentifierValue.other },
    .{ "onemptied", PureGlobalIdentifierValue.other },
    .{ "onended", PureGlobalIdentifierValue.other },
    .{ "onerror", PureGlobalIdentifierValue.other },
    .{ "onfocus", PureGlobalIdentifierValue.other },
    .{ "ongotpointercapture", PureGlobalIdentifierValue.other },
    .{ "onhashchange", PureGlobalIdentifierValue.other },
    .{ "oninput", PureGlobalIdentifierValue.other },
    .{ "oninvalid", PureGlobalIdentifierValue.other },
    .{ "onkeydown", PureGlobalIdentifierValue.other },
    .{ "onkeypress", PureGlobalIdentifierValue.other },
    .{ "onkeyup", PureGlobalIdentifierValue.other },
    .{ "onlanguagechange", PureGlobalIdentifierValue.other },
    .{ "onload", PureGlobalIdentifierValue.other },
    .{ "onloadeddata", PureGlobalIdentifierValue.other },
    .{ "onloadedmetadata", PureGlobalIdentifierValue.other },
    .{ "onloadstart", PureGlobalIdentifierValue.other },
    .{ "onlostpointercapture", PureGlobalIdentifierValue.other },
    .{ "onmessage", PureGlobalIdentifierValue.other },
    .{ "onmousedown", PureGlobalIdentifierValue.other },
    .{ "onmouseenter", PureGlobalIdentifierValue.other },
    .{ "onmouseleave", PureGlobalIdentifierValue.other },
    .{ "onmousemove", PureGlobalIdentifierValue.other },
    .{ "onmouseout", PureGlobalIdentifierValue.other },
    .{ "onmouseover", PureGlobalIdentifierValue.other },
    .{ "onmouseup", PureGlobalIdentifierValue.other },
    .{ "onoffline", PureGlobalIdentifierValue.other },
    .{ "ononline", PureGlobalIdentifierValue.other },
    .{ "onpagehide", PureGlobalIdentifierValue.other },
    .{ "onpageshow", PureGlobalIdentifierValue.other },
    .{ "onpause", PureGlobalIdentifierValue.other },
    .{ "onplay", PureGlobalIdentifierValue.other },
    .{ "onplaying", PureGlobalIdentifierValue.other },
    .{ "onpointercancel", PureGlobalIdentifierValue.other },
    .{ "onpointerdown", PureGlobalIdentifierValue.other },
    .{ "onpointerenter", PureGlobalIdentifierValue.other },
    .{ "onpointerleave", PureGlobalIdentifierValue.other },
    .{ "onpointermove", PureGlobalIdentifierValue.other },
    .{ "onpointerout", PureGlobalIdentifierValue.other },
    .{ "onpointerover", PureGlobalIdentifierValue.other },
    .{ "onpointerup", PureGlobalIdentifierValue.other },
    .{ "onpopstate", PureGlobalIdentifierValue.other },
    .{ "onprogress", PureGlobalIdentifierValue.other },
    .{ "onratechange", PureGlobalIdentifierValue.other },
    .{ "onrejectionhandled", PureGlobalIdentifierValue.other },
    .{ "onreset", PureGlobalIdentifierValue.other },
    .{ "onresize", PureGlobalIdentifierValue.other },
    .{ "onscroll", PureGlobalIdentifierValue.other },
    .{ "onseeked", PureGlobalIdentifierValue.other },
    .{ "onseeking", PureGlobalIdentifierValue.other },
    .{ "onselect", PureGlobalIdentifierValue.other },
    .{ "onstalled", PureGlobalIdentifierValue.other },
    .{ "onstorage", PureGlobalIdentifierValue.other },
    .{ "onsubmit", PureGlobalIdentifierValue.other },
    .{ "onsuspend", PureGlobalIdentifierValue.other },
    .{ "ontimeupdate", PureGlobalIdentifierValue.other },
    .{ "ontoggle", PureGlobalIdentifierValue.other },
    .{ "ontransitioncancel", PureGlobalIdentifierValue.other },
    .{ "ontransitionend", PureGlobalIdentifierValue.other },
    .{ "ontransitionrun", PureGlobalIdentifierValue.other },
    .{ "ontransitionstart", PureGlobalIdentifierValue.other },
    .{ "onunhandledrejection", PureGlobalIdentifierValue.other },
    .{ "onunload", PureGlobalIdentifierValue.other },
    .{ "onvolumechange", PureGlobalIdentifierValue.other },
    .{ "onwaiting", PureGlobalIdentifierValue.other },
    .{ "onwebkitanimationend", PureGlobalIdentifierValue.other },
    .{ "onwebkitanimationiteration", PureGlobalIdentifierValue.other },
    .{ "onwebkitanimationstart", PureGlobalIdentifierValue.other },
    .{ "onwebkittransitionend", PureGlobalIdentifierValue.other },
    .{ "onwheel", PureGlobalIdentifierValue.other },
    .{ "open", PureGlobalIdentifierValue.other },
    .{ "opener", PureGlobalIdentifierValue.other },
    .{ "origin", PureGlobalIdentifierValue.other },
    .{ "outerHeight", PureGlobalIdentifierValue.other },
    .{ "outerWidth", PureGlobalIdentifierValue.other },
    .{ "parent", PureGlobalIdentifierValue.other },
    .{ "performance", PureGlobalIdentifierValue.other },
    .{ "personalbar", PureGlobalIdentifierValue.other },
    .{ "postMessage", PureGlobalIdentifierValue.other },
    .{ "print", PureGlobalIdentifierValue.other },
    .{ "prompt", PureGlobalIdentifierValue.other },
    .{ "releaseEvents", PureGlobalIdentifierValue.other },
    .{ "requestAnimationFrame", PureGlobalIdentifierValue.other },
    .{ "resizeBy", PureGlobalIdentifierValue.other },
    .{ "resizeTo", PureGlobalIdentifierValue.other },
    .{ "screen", PureGlobalIdentifierValue.other },
    .{ "screenLeft", PureGlobalIdentifierValue.other },
    .{ "screenTop", PureGlobalIdentifierValue.other },
    .{ "screenX", PureGlobalIdentifierValue.other },
    .{ "screenY", PureGlobalIdentifierValue.other },
    .{ "scroll", PureGlobalIdentifierValue.other },
    .{ "scrollBy", PureGlobalIdentifierValue.other },
    .{ "scrollTo", PureGlobalIdentifierValue.other },
    .{ "scrollbars", PureGlobalIdentifierValue.other },
    .{ "self", PureGlobalIdentifierValue.other },
    .{ "speechSynthesis", PureGlobalIdentifierValue.other },
    .{ "status", PureGlobalIdentifierValue.other },
    .{ "statusbar", PureGlobalIdentifierValue.other },
    .{ "stop", PureGlobalIdentifierValue.other },
    .{ "toolbar", PureGlobalIdentifierValue.other },
    .{ "top", PureGlobalIdentifierValue.other },
    .{ "webkitURL", PureGlobalIdentifierValue.other },
    .{ "window", PureGlobalIdentifierValue.other },
    .{ "crypto", PureGlobalIdentifierValue.other },
});

const string = []const u8;

const defines = @import("./defines.zig");
const std = @import("std");

const bun = @import("bun");
const js_ast = bun.ast;
